package be.xhibit.teletask.webapp.websocket;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import javax.websocket.OnClose;
import javax.websocket.OnError;
import javax.websocket.OnMessage;
import javax.websocket.OnOpen;
import javax.websocket.Session;
import java.util.ArrayList;
import java.util.Collection;
import java.util.concurrent.ConcurrentLinkedQueue;
public class JSONBroadcastingWebSocket {
private static final Collection<Session> CURRENT_CLIENTS = new ConcurrentLinkedQueue<>();
protected static void sendAll(Object data) throws JsonProcessingException {
String msg = new ObjectMapper().writer().withDefaultPrettyPrinter().writeValueAsString(data);
try {
Collection<Session> closedSessions = new ArrayList<>();
for (Session session : CURRENT_CLIENTS) {
if (!session.isOpen()) {
closedSessions.add(session);
} else {
session.getBasicRemote().sendText(msg);
}
}
CURRENT_CLIENTS.removeAll(closedSessions);
} catch (Throwable e) {
e.printStackTrace();
}
}
public static int getClientCount() {
return CURRENT_CLIENTS.size();
}
@OnMessage
public void onMessage(Session session, String msg) {
}
@OnOpen
public void open(Session session) {
CURRENT_CLIENTS.add(session);
}
@OnError
public void error(Session session, Throwable t) {
CURRENT_CLIENTS.remove(session);
}
@OnClose
public void closedConnection(Session session) {
CURRENT_CLIENTS.remove(session);
}
}